iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
Mobile Development

IOS Beginner's 30days 系列 第 20

Day20 Regular Expression

  • 分享至 

  • xImage
  •  

Regular Expression

中文:正規表示式,又稱正則表達式,是電腦科學的一種概念,使用單個字串來描述、匹配一系列符合某個句法規則的字串。

在程式中常用來檢查使用者輸入的資料是否符合格式
Ex.

    //電子信箱
        let regexEM = "^([a-z0-9_\\.-])@([\\da-z\\.-]).([a-z\\.]{2,6})$"
    //開頭為大寫字母,總長度在五到十碼以內的密碼
        let regexPW = "^[A-Z][0-9A-Za-z]{4,9}$"

以下是範例程式:
四種不同的輸入格式,當我按下檢查時會執行檢查,不符格式的輸入匡,邊匡會變成紅色,修改正確就會變回來。

import UIKit

class ViewController: UIViewController {
    
    // OutletCollection 將許多同類的元件放進同一個 Outlet 統一管理( 通常用在元件做的事情差不多的時候 )
    @IBOutlet var textFields: [UITextField]!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        viewInit()
        delegateAndDataSourseInit()
    }
    
    
    @IBAction func checkBtnClick(_ sender: UIButton) {
        let regexEmail = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+).([a-z\\.]{2,6})$"
        let regexPhoneNumber = "^09[0-9]{8}$"
        let regexID = "^[A-Z][1-2][0-9]{8}$"
        let regexName = "^[A-Z][a-z]{2,8}$"
        
        for i in 0...textFields.count - 1 {
            switch i {
            case 0:
                compareAndChange(regex: regexEmail, textField: textFields[i])
            case 1:
                compareAndChange(regex: regexPhoneNumber, textField: textFields[i])
            case 2:
                compareAndChange(regex: regexID, textField: textFields[i])
            default:
                compareAndChange(regex: regexName, textField: textFields[i])
            }
        }
    }
    
    
    func viewInit() {
        // 幫每個 TextField 加上 tag 以便區分
        for i in 0...textFields.count - 1 {
            textFields[i].tag = i
        }
    }
    
    func delegateAndDataSourseInit() {
        // forEach 會逛過陣列中所有的項目
        textFields.forEach { (textField) in
            // 委任
            textField.delegate = self
        }
    }
    
    // 檢查並改變外觀
    func compareAndChange(regex: String, textField: UITextField) {
        if compare(regex: regex, textField: textField) == 0 {
            // 不符格式
            changeBorderColor(textField: textField, Case: 0)
        } else {
            // 符合格式
            changeBorderColor(textField: textField, Case: 1)
        }
    }
    
    // 檢查格式
    func compare(regex: String,textField: UITextField) -> Int{
        // 根據格式的起始符號(^)及終止符號($)去檢查格式
        let RE = try! NSRegularExpression(pattern: regex, options: .anchorsMatchLines)
        
        // 符合格式為 1,否則為 0
        let matchs = RE.matches(in: textField.text!, options: .reportProgress, range: NSRange(location: 0, length: textField.text!.count))
        
        return matchs.count
    }
    
    // 改變 TextField 的外觀
    func changeBorderColor(textField: UITextField, Case:Int) {
        switch Case {
        case 0:
            textField.borderStyle = .roundedRect
            textField.layer.borderWidth = 1.0
            textField.layer.borderColor = UIColor.red.cgColor
            textField.layer.shadowColor = UIColor.red.cgColor
        default:
            textField.layer.borderWidth = 0.0
            textField.layer.shadowColor = UIColor.lightGray.cgColor
        }
    }
}

extension ViewController: UITextFieldDelegate {
    
    // 按下 Enter 後自動跳行
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        
        let nextTag = textField.tag + 1
        
        guard let nextTextField = textField.superview?.viewWithTag(nextTag) else {
            // 如過是做後一個輸入匡則關閉鍵盤
            textField.resignFirstResponder()
            textField.endEditing(true)
            return true
        }
        
        nextTextField.becomeFirstResponder()
        return true
    }
    
}

https://ithelp.ithome.com.tw/upload/images/20200923/20129677rS1GOzA4HH.pnghttps://ithelp.ithome.com.tw/upload/images/20200923/20129677ks3We9HmhA.pnghttps://ithelp.ithome.com.tw/upload/images/20200923/20129677WEgDXstl2o.png

參考網站:
就是愛程式 -> https://atedev.wordpress.com/2007/11/23/正規表示式-regular-expression/
程式前沿 -> https://codertw.com/程式語言/681117/#outline__1_3


上一篇
Day19 UITextField(二)
下一篇
Day21 UIStoryboardSegue
系列文
IOS Beginner's 30days 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言